// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: braces fieldsfirst space lnc package com.xiaomi.infra.galaxy.common.auth; import com.xiaomi.infra.galaxy.common.BasicGalaxyRequest; import com.xiaomi.infra.galaxy.common.GalaxyClientException; import com.xiaomi.infra.galaxy.common.HttpMethodName; import com.xiaomi.infra.galaxy.common.constants.ReturnCode; import com.xiaomi.infra.galaxy.common.util.BinaryUtils; import com.xiaomi.infra.galaxy.common.util.HttpUtils; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; // Referenced classes of package com.xiaomi.infra.galaxy.common.auth: // AbstractGalaxySigner, GalaxyCredentials, SigningAlgorithm, AnonymousGalaxyCredentials, // AppSecretCredentials, SessionCredentials public class Galaxy4Signer extends AbstractGalaxySigner { protected static final String ALGORITHM = "Galaxy-HMAC-SHA256"; protected static final String TERMINATOR = "galaxy_request"; protected static final Log log = LogFactory.getLog(com/xiaomi/infra/galaxy/common/auth/Galaxy4Signer); protected ThreadLocal dateStampFormat; protected ThreadLocal dateTimeFormat; protected Date overriddenDate; protected String serviceName; public Galaxy4Signer() { dateTimeFormat = new _cls1(); dateStampFormat = new _cls2(); } protected void addHostHeader(BasicGalaxyRequest basicgalaxyrequest) { String s = basicgalaxyrequest.getEndpoint().getHost(); if (HttpUtils.isUsingNonDefaultPort(basicgalaxyrequest.getEndpoint())) { s = (new StringBuilder()).append(s).append(":").append(basicgalaxyrequest.getEndpoint().getPort()).toString(); } basicgalaxyrequest.addHeader("Host", s); } protected String calculateContentHash(BasicGalaxyRequest basicgalaxyrequest) { InputStream inputstream = getBinaryRequestPayloadStream(basicgalaxyrequest); inputstream.mark(-1); String s = BinaryUtils.toHex(hash(inputstream)); try { inputstream.reset(); } catch (IOException ioexception) { throw new GalaxyClientException(ReturnCode.SIGNATURE_FAILED, "Unable to reset stream after calculating galaxy signature", ioexception); } return s; } protected HeaderSigningResult computeSignature(BasicGalaxyRequest basicgalaxyrequest, Date date, String s, String s1, GalaxyCredentials galaxycredentials) { String s2 = getDateTimeStamp(date); String s3 = getDateStamp(date); StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append(s3).append("/").append("Galaxy").append("/").append("galaxy_request"); StringBuilder stringbuilder1 = getStringToSign(s, s2, stringbuilder, getCanonicalRequest(basicgalaxyrequest, s1)); StringBuilder stringbuilder2 = new StringBuilder(); stringbuilder2.append("Galaxy").append(galaxycredentials.getGalaxySecretKey()); byte abyte0[] = sign("galaxy_request", sign("Galaxy", sign(s3, stringbuilder2.toString().getBytes(), SigningAlgorithm.HmacSHA256), SigningAlgorithm.HmacSHA256), SigningAlgorithm.HmacSHA256); byte abyte1[] = sign(stringbuilder1.toString().getBytes(), abyte0, SigningAlgorithm.HmacSHA256); return new HeaderSigningResult(s2, stringbuilder.toString(), abyte0, abyte1); } protected StringBuilder getCanonicalRequest(BasicGalaxyRequest basicgalaxyrequest, String s) { StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append(basicgalaxyrequest.getHttpMethod().toString()).append("\n").append(getCanonicalizedResourcePath(basicgalaxyrequest.getResourcePath())).append("\n").append(getCanonicalizedQueryString(basicgalaxyrequest)).append("\n").append(getCanonicalizedHeaderString(basicgalaxyrequest)).append("\n").append(getSignedHeadersString(basicgalaxyrequest)).append("\n").append(s); if (log.isDebugEnabled()) { log.debug((new StringBuilder()).append("Galaxy Canonical Request: '\"").append(stringbuilder).append("\"").toString()); } return stringbuilder; } protected String getCanonicalizedHeaderString(BasicGalaxyRequest basicgalaxyrequest) { ArrayList arraylist = new ArrayList(); arraylist.addAll(basicgalaxyrequest.getHeaders().keySet()); Collections.sort(arraylist, String.CASE_INSENSITIVE_ORDER); StringBuilder stringbuilder = new StringBuilder(); for (Iterator iterator = arraylist.iterator(); iterator.hasNext(); stringbuilder.append("\n")) { String s = (String)iterator.next(); stringbuilder.append((new StringBuilder()).append(s.toLowerCase().replaceAll("\\s+", " ")).append(":").append(((String)basicgalaxyrequest.getHeaders().get(s)).replaceAll("\\s+", " ")).toString()); } return stringbuilder.toString(); } protected String getDateStamp(Date date) { return ((SimpleDateFormat)dateStampFormat.get()).format(date); } protected String getDateTimeStamp(Date date) { return ((SimpleDateFormat)dateTimeFormat.get()).format(date); } protected StringBuilder getScope(BasicGalaxyRequest basicgalaxyrequest, Date date) { String s = getDateStamp(date); StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append(s).append("/").append(serviceName).append("/").append("galaxy_request"); return stringbuilder; } protected StringBuilder getSignedHeadersString(BasicGalaxyRequest basicgalaxyrequest) { ArrayList arraylist = new ArrayList(); arraylist.addAll(basicgalaxyrequest.getHeaders().keySet()); Collections.sort(arraylist, String.CASE_INSENSITIVE_ORDER); StringBuilder stringbuilder = new StringBuilder(); String s; for (Iterator iterator = arraylist.iterator(); iterator.hasNext(); stringbuilder.append(s.toLowerCase())) { s = (String)iterator.next(); if (stringbuilder.length() > 0) { stringbuilder.append(";"); } } return stringbuilder; } protected StringBuilder getStringToSign(String s, String s1, CharSequence charsequence, CharSequence charsequence1) { StringBuilder stringbuilder = new StringBuilder(); stringbuilder.append(s).append("\n").append(s1).append("\n").append(charsequence).append("\n").append(BinaryUtils.toHex(hash(charsequence1.toString()))); if (log.isDebugEnabled()) { log.debug((new StringBuilder()).append("Galaxy String to Sign: '\"").append(stringbuilder).append("\"").toString()); } return stringbuilder; } void overrideDate(Date date) { overriddenDate = date; } protected void processRequestPayload(BasicGalaxyRequest basicgalaxyrequest, HeaderSigningResult headersigningresult) { } public void setServiceName(String s) { serviceName = s; } public void sign(BasicGalaxyRequest basicgalaxyrequest, GalaxyCredentials galaxycredentials) { if (galaxycredentials instanceof AnonymousGalaxyCredentials) { basicgalaxyrequest.addHeader("X-XiaoMi-Access-Method", "anonymous"); return; } if (galaxycredentials instanceof AppSecretCredentials) { basicgalaxyrequest.addHeader("X-XiaoMi-Access-Method", "appsecrettoken"); basicgalaxyrequest.addHeader("X-XiaoMi-Token", galaxycredentials.getGalaxySecretKey()); } GalaxyCredentials galaxycredentials1 = sanitizeCredentials(galaxycredentials); if (galaxycredentials instanceof SessionCredentials) { basicgalaxyrequest.addHeader("X-XiaoMi-Token", galaxycredentials.getGalaxySecretKey()); } addHostHeader(basicgalaxyrequest); Date date = new Date(); StringBuilder stringbuilder = getScope(basicgalaxyrequest, date); String s = calculateContentHash(basicgalaxyrequest); basicgalaxyrequest.addHeader("X-XiaoMi-Date", getDateTimeStamp(date)); if (basicgalaxyrequest.getHeaders().get("X-XiaoMi-Content-Sha256") != null && ((String)basicgalaxyrequest.getHeaders().get("X-XiaoMi-Content-Sha256")).equals("required")) { basicgalaxyrequest.addHeader("X-XiaoMi-Content-Sha256", s); } basicgalaxyrequest.addHeader("X-XiaoMi-Content-Sha256", s); StringBuilder stringbuilder1 = new StringBuilder(); stringbuilder1.append(galaxycredentials1.getGalaxyAppId()).append("/").append(stringbuilder); HeaderSigningResult headersigningresult = computeSignature(basicgalaxyrequest, date, "Galaxy-HMAC-SHA256", s, galaxycredentials1); StringBuilder stringbuilder2 = new StringBuilder(); stringbuilder2.append("Credential=").append(stringbuilder1); StringBuilder stringbuilder3 = new StringBuilder(); stringbuilder3.append("SignedHeaders=").append(getSignedHeadersString(basicgalaxyrequest)); StringBuilder stringbuilder4 = new StringBuilder(); stringbuilder4.append("Signature=").append(BinaryUtils.toHex(headersigningresult.getSignature())); StringBuilder stringbuilder5 = new StringBuilder(); stringbuilder5.append("Galaxy-HMAC-SHA256").append(" ").append(stringbuilder2).append(", ").append(stringbuilder3).append(", ").append(stringbuilder4); basicgalaxyrequest.addHeader("Authorization", stringbuilder5.toString()); processRequestPayload(basicgalaxyrequest, headersigningresult); } private class _cls1 extends ThreadLocal { final Galaxy4Signer this$0; protected volatile Object initialValue() { return initialValue(); } protected SimpleDateFormat initialValue() { SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); simpledateformat.setTimeZone(new SimpleTimeZone(0, "UTC")); return simpledateformat; } _cls1() { this$0 = Galaxy4Signer.this; super(); } } private class _cls2 extends ThreadLocal { final Galaxy4Signer this$0; protected volatile Object initialValue() { return initialValue(); } protected SimpleDateFormat initialValue() { SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyyMMdd"); simpledateformat.setTimeZone(new SimpleTimeZone(0, "UTC")); return simpledateformat; } _cls2() { this$0 = Galaxy4Signer.this; super(); } } private class HeaderSigningResult { private String dateTime; private byte kSigning[]; private String scope; private byte signature[]; final Galaxy4Signer this$0; public String getDateTime() { return dateTime; } public byte[] getKSigning() { byte abyte0[] = new byte[kSigning.length]; System.arraycopy(kSigning, 0, abyte0, 0, kSigning.length); return abyte0; } public String getScope() { return scope; } public byte[] getSignature() { byte abyte0[] = new byte[signature.length]; System.arraycopy(signature, 0, abyte0, 0, signature.length); return abyte0; } public HeaderSigningResult(String s, String s1, byte abyte0[], byte abyte1[]) { this$0 = Galaxy4Signer.this; super(); dateTime = s; scope = s1; kSigning = abyte0; signature = abyte1; } } }